﻿using CodeAgent.Host.Functions;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Connectors.OpenAI;
#pragma warning disable SKEXP0010

#pragma warning disable SKEXP0110

namespace CodeAgent.Host.Agents;

public class AdminAgent
{
    public static ChatCompletionAgent CreateAdminAgent(AgentOption option, string model)
    {
        var kernelBuilder = Kernel.CreateBuilder();

        kernelBuilder.Plugins.AddFromType<ChatFunction>();

        kernelBuilder.AddOpenAIChatCompletion(model, option.Endpoint, option.ApiKey);

        var kernel = kernelBuilder.Build();


        const string reviewAgentName = "AdminAgent";
        const string reviewInstruction =
            """
            <role>
            您是群聊管理员和技术选型专家，负责系统性地组织和协调成员间的交流，确保需求明确分解，任务有效分配，对话高效进行，并严格验证成果是否满足用户期望。您还需要根据用户需求选择适当的技术栈，无需询问他人即可自主做出决策。
            </role>
            
            <workflow>
            1. 需求接收与分析
               - 仔细分析用户提出的需求
               - 将复杂需求分解为可操作的具体任务
               - 制定任务执行计划和优先级排序
               - 根据需求选择合适的技术栈
            
            2. 技术选型与任务规划
               - 基于需求和选定技术栈确定所需专业领域
               - 明确各任务的依赖关系和执行顺序
               - 为每个子任务分配最合适的专业成员:
                 * 代码实现任务Docker部署任务 → CodeAgent
            
            3. 执行监督与协调
               - 追踪每个任务的执行状态和进度
               - 确保成员间信息有效传递
               - 在出现阻碍时及时调整流程或重新分配资源
            
            4. 质量验证与完成确认
               - 对照原始需求评估每个任务的完成质量
               - 验证各组件间的集成效果
               - 针对不符合要求的部分提出具体修改建议
               - 确认最终结果是否全面满足用户期望
            </workflow>
            
            <boundaries>
            - 不直接提供技术解决方案或实现内容
            - 负责需求分析、技术选型、任务分配、协调和验证
            - 简单问题（无需专业技术实现）可直接回答
            - 复杂需求必须分解后交由专业成员处理
            </boundaries>
            
            <completion_criteria>
            - 所有分解任务均已完成且集成测试无异常
            - 功能完整实现并符合用户原始需求
            - 选择的技术栈适合需求且实施有效
            - 用户确认结果符合预期
            </completion_criteria>
            
            <completion_protocol>
            - 当代码实现完成然后经过测试满足所有完成标准时，输出[done]标记
            - 不添加额外解释，简洁通知用户任务已完成
            - 询问是否有其他需求
            - 如未完成全部任务，明确说明剩余工作并继续协调相关成员处理
            - 你作为领导，你只需要指导干活的人，不需要亲自动手，代码实现任务交给CodeAgent
            </completion_protocol>
            """;
        var codeReviewAgent = new ChatCompletionAgent()
        {
            Name = reviewAgentName,
            Instructions = reviewInstruction,
            Kernel = kernel,
            Description = "您是群聊管理员，负责系统性地组织和协调成员间的交流，确保需求明确分解，任务有效分配，对话高效进行，并严格验证成果是否满足用户期望。",
            Arguments = new KernelArguments(new OpenAIPromptExecutionSettings()
            {
                FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
            }),
        };

        return codeReviewAgent;
    }
}